Define spin_barrier_irq() for IRQ-safe spinlocks, and use it for virq_lock.
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 22 Oct 2008 14:06:01 +0000 (15:06 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 22 Oct 2008 14:06:01 +0000 (15:06 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/common/event_channel.c
xen/common/spinlock.c
xen/include/xen/spinlock.h

index 8e3e0d1f64d81fddd68f35ddb01cd176d0fd13e1..3993df4bc52a395f7332f8b488cf6006129c27f5 100644 (file)
@@ -386,7 +386,7 @@ static long __evtchn_close(struct domain *d1, int port1)
             if ( v->virq_to_evtchn[chn1->u.virq] != port1 )
                 continue;
             v->virq_to_evtchn[chn1->u.virq] = 0;
-            spin_barrier(&v->virq_lock);
+            spin_barrier_irq(&v->virq_lock);
         }
         break;
 
index 15420ebfe735e55facaba9ff2fb9f80a967eb607..125e12d1bf3978d90206aaf76c34821f85f92604 100644 (file)
@@ -54,6 +54,14 @@ void _spin_barrier(spinlock_t *lock)
     mb();
 }
 
+void _spin_barrier_irq(spinlock_t *lock)
+{
+    unsigned long flags;
+    local_irq_save(flags);
+    _spin_barrier(lock);
+    local_irq_restore(flags);
+}
+
 void _spin_lock_recursive(spinlock_t *lock)
 {
     int cpu = smp_processor_id();
index 289018fea0defd20966f48eca1f3cd15fa3dfc27..c49be63c5f138cdd4ac959543a46761fb8aa4691 100644 (file)
@@ -34,6 +34,7 @@ void _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags);
 int _spin_is_locked(spinlock_t *lock);
 int _spin_trylock(spinlock_t *lock);
 void _spin_barrier(spinlock_t *lock);
+void _spin_barrier_irq(spinlock_t *lock);
 
 void _spin_lock_recursive(spinlock_t *lock);
 void _spin_unlock_recursive(spinlock_t *lock);
@@ -67,6 +68,7 @@ void _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
 
 /* Ensure a lock is quiescent between two critical operations. */
 #define spin_barrier(l)               _spin_barrier(l)
+#define spin_barrier_irq(l)           _spin_barrier_irq(l)
 
 /*
  * spin_[un]lock_recursive(): Use these forms when the lock can (safely!) be